<?php

namespace JLPay\Models\Trans\Common;

use JLPay\Models\BaseRequest;

/**
 * 预授权撤销请求模型
 */
class PreAuthRevokeRequest extends BaseRequest
{
    /**
     * @var string|null 商户号
     */
    private ?string $mchId = null;

    /**
     * @var string|null 终端号
     */
    private ?string $termNo = null;

    /**
     * @var string|null 支付类型
     */
    private ?string $payType = null;

    /**
     * @var string|null 外部订单号
     */
    private ?string $outTradeNo = null;

    /**
     * @var string|null 原外部订单号
     */
    private ?string $oriOutTradeNo = null;

    /**
     * @var string|null 原平台订单号
     */
    private ?string $oriTransactionId = null;

    /**
     * @var string|null 担保授权码
     */
    private ?string $guaranteeAuthCode = null;

    /**
     * @var string|null 交易金额
     */
    private ?string $totalFee = null;

    /**
     * @var string|null 备注
     */
    private ?string $remark = null;

    /**
     * @var string|null 设备信息
     */
    private ?string $deviceInfo = null;

    /**
     * @var string|null 终端IP
     */
    private ?string $mchCreateIp = null;

    /**
     * @var string|null 交易地址
     */
    private ?string $transAddress = null;

    /**
     * @var string|null 地区代码
     */
    private ?string $areaCode = null;

    /**
     * @var string|null 经度
     */
    private ?string $longitude = null;

    /**
     * @var string|null 纬度
     */
    private ?string $latitude = null;

    /**
     * 获取API路径
     *
     * @return string API路径
     */
    public function getApiPath(): string
    {
        return '/open/trans/preauthrevoke';
    }

    /**
     * 设置商户号
     *
     * @param string $mchId 商户号
     * @return $this
     */
    public function setMchId(string $mchId): self
    {
        $this->mchId = $mchId;
        return $this;
    }

    /**
     * 获取商户号
     *
     * @return string|null 商户号
     */
    public function getMchId(): ?string
    {
        return $this->mchId;
    }

    /**
     * 设置终端号
     *
     * @param string $termNo 终端号
     * @return $this
     */
    public function setTermNo(string $termNo): self
    {
        $this->termNo = $termNo;
        return $this;
    }

    /**
     * 获取终端号
     *
     * @return string|null 终端号
     */
    public function getTermNo(): ?string
    {
        return $this->termNo;
    }

    /**
     * 设置支付类型
     *
     * @param string $payType 支付类型
     * @return $this
     */
    public function setPayType(string $payType): self
    {
        $this->payType = $payType;
        return $this;
    }

    /**
     * 获取支付类型
     *
     * @return string|null 支付类型
     */
    public function getPayType(): ?string
    {
        return $this->payType;
    }

    /**
     * 设置外部订单号
     *
     * @param string $outTradeNo 外部订单号
     * @return $this
     */
    public function setOutTradeNo(string $outTradeNo): self
    {
        $this->outTradeNo = $outTradeNo;
        return $this;
    }

    /**
     * 获取外部订单号
     *
     * @return string|null 外部订单号
     */
    public function getOutTradeNo(): ?string
    {
        return $this->outTradeNo;
    }

    /**
     * 设置原外部订单号
     *
     * @param string $oriOutTradeNo 原外部订单号
     * @return $this
     */
    public function setOriOutTradeNo(string $oriOutTradeNo): self
    {
        $this->oriOutTradeNo = $oriOutTradeNo;
        return $this;
    }

    /**
     * 获取原外部订单号
     *
     * @return string|null 原外部订单号
     */
    public function getOriOutTradeNo(): ?string
    {
        return $this->oriOutTradeNo;
    }

    /**
     * 设置原平台订单号
     *
     * @param string $oriTransactionId 原平台订单号
     * @return $this
     */
    public function setOriTransactionId(string $oriTransactionId): self
    {
        $this->oriTransactionId = $oriTransactionId;
        return $this;
    }

    /**
     * 获取原平台订单号
     *
     * @return string|null 原平台订单号
     */
    public function getOriTransactionId(): ?string
    {
        return $this->oriTransactionId;
    }

    /**
     * 设置担保授权码
     *
     * @param string $guaranteeAuthCode 担保授权码
     * @return $this
     */
    public function setGuaranteeAuthCode(string $guaranteeAuthCode): self
    {
        $this->guaranteeAuthCode = $guaranteeAuthCode;
        return $this;
    }

    /**
     * 获取担保授权码
     *
     * @return string|null 担保授权码
     */
    public function getGuaranteeAuthCode(): ?string
    {
        return $this->guaranteeAuthCode;
    }

    /**
     * 设置交易金额
     *
     * @param string $totalFee 交易金额
     * @return $this
     */
    public function setTotalFee(string $totalFee): self
    {
        $this->totalFee = $totalFee;
        return $this;
    }

    /**
     * 获取交易金额
     *
     * @return string|null 交易金额
     */
    public function getTotalFee(): ?string
    {
        return $this->totalFee;
    }

    /**
     * 设置备注
     *
     * @param string $remark 备注
     * @return $this
     */
    public function setRemark(string $remark): self
    {
        $this->remark = $remark;
        return $this;
    }

    /**
     * 获取备注
     *
     * @return string|null 备注
     */
    public function getRemark(): ?string
    {
        return $this->remark;
    }

    /**
     * 设置设备信息
     *
     * @param string $deviceInfo 设备信息
     * @return $this
     */
    public function setDeviceInfo(string $deviceInfo): self
    {
        $this->deviceInfo = $deviceInfo;
        return $this;
    }

    /**
     * 获取设备信息
     *
     * @return string|null 设备信息
     */
    public function getDeviceInfo(): ?string
    {
        return $this->deviceInfo;
    }

    /**
     * 设置终端IP
     *
     * @param string $mchCreateIp 终端IP
     * @return $this
     */
    public function setMchCreateIp(string $mchCreateIp): self
    {
        $this->mchCreateIp = $mchCreateIp;
        return $this;
    }

    /**
     * 获取终端IP
     *
     * @return string|null 终端IP
     */
    public function getMchCreateIp(): ?string
    {
        return $this->mchCreateIp;
    }

    /**
     * 设置交易地址
     *
     * @param string $transAddress 交易地址
     * @return $this
     */
    public function setTransAddress(string $transAddress): self
    {
        $this->transAddress = $transAddress;
        return $this;
    }

    /**
     * 获取交易地址
     *
     * @return string|null 交易地址
     */
    public function getTransAddress(): ?string
    {
        return $this->transAddress;
    }

    /**
     * 设置地区代码
     *
     * @param string $areaCode 地区代码
     * @return $this
     */
    public function setAreaCode(string $areaCode): self
    {
        $this->areaCode = $areaCode;
        return $this;
    }

    /**
     * 获取地区代码
     *
     * @return string|null 地区代码
     */
    public function getAreaCode(): ?string
    {
        return $this->areaCode;
    }

    /**
     * 设置经度
     *
     * @param string $longitude 经度
     * @return $this
     */
    public function setLongitude(string $longitude): self
    {
        $this->longitude = $longitude;
        return $this;
    }

    /**
     * 获取经度
     *
     * @return string|null 经度
     */
    public function getLongitude(): ?string
    {
        return $this->longitude;
    }

    /**
     * 设置纬度
     *
     * @param string $latitude 纬度
     * @return $this
     */
    public function setLatitude(string $latitude): self
    {
        $this->latitude = $latitude;
        return $this;
    }

    /**
     * 获取纬度
     *
     * @return string|null 纬度
     */
    public function getLatitude(): ?string
    {
        return $this->latitude;
    }

    /**
     * 转换为数组格式
     *
     * @return array 数组格式的数据
     */
    public function toArray(): array
    {
        $data = parent::toArray();
        $data = array_merge($data, [
            'mch_id' => $this->mchId,
            'term_no' => $this->termNo,
            'pay_type' => $this->payType,
            'out_trade_no' => $this->outTradeNo,
            'ori_out_trade_no' => $this->oriOutTradeNo,
            'ori_transaction_id' => $this->oriTransactionId,
            'guarantee_auth_code' => $this->guaranteeAuthCode,
            'total_fee' => $this->totalFee,
            'remark' => $this->remark,
            'device_info' => $this->deviceInfo,
            'mch_create_ip' => $this->mchCreateIp,
            'trans_address' => $this->transAddress,
            'area_code' => $this->areaCode,
            'longitude' => $this->longitude,
            'latitude' => $this->latitude
        ]);

        return $data;
    }
} 